home *** CD-ROM | disk | FTP | other *** search
- #
- # This file is part of OpenVIP (http://openvip.sourceforge.net)
- #
- # Copyright (C) 2002-2003
- # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
- #
- # This program is licensed under GNU General Public License version 2;
- # see file COPYING in the top level directory for details.
- #
- # $Id: render.py,v 1.7 2003/06/03 21:01:13 vaclavslavik Exp $
- #
- # This module provides functions for background rendering, with
- # optional progress indicator.
- #
-
- from wxPython.wx import *
- import openvip
- import logging, globals, worker
-
- #----------------------------------------------------------------------
- # Notification event, sent when rendering finishes:
- #----------------------------------------------------------------------
-
- wxEVT_RENDERING_DONE = wxNewEventType()
-
- def EVT_RENDERING_DONE(win, func):
- """Use this to listen to event fired when rendering finishes"""
- win.Connect(-1, -1, wxEVT_RENDERING_DONE, func)
-
- class RenderingDoneEvent(wxPyEvent):
- """Event catched using EVT_RENDERING_DONE."""
- def __init__(self, id=None, data=None):
- wxPyEvent.__init__(self)
- self.SetEventType(wxEVT_RENDERING_DONE)
- self.id = id
- self.data = data
-
-
- #----------------------------------------------------------------------
- # Background rendering thread and helper objects:
- #----------------------------------------------------------------------
-
- class Rendering:
- """This is a thread that renders a network on background"""
- def __init__(self, job, id, window):
- self.id = id
- self.data = None
- self.window = window
- self.job = job
-
- def run(self):
- self.job.run(self)
- evt = RenderingDoneEvent(self.id, self.data)
- wxPostEvent(self.window, evt)
-
- class JobFromString:
- def __init__(self, net, ui):
- self.net = net
- self.ui = ui
- def run(self, obj):
- task = globals.core.load_network_from_string(self.net)
- task.render(self.ui)
-
- class JobSingleFrame:
- def __init__(self, task, frame):
- self.task = task
- self.frame = frame
- def run(self, obj):
- obj.data = self.task.render_single_frame(self.frame)
-
-
- #----------------------------------------------------------------------
- # Public API:
- #----------------------------------------------------------------------
-
-
- def renderFromString(net, window, id=None,
- progress=True, cancellable=False,
- background=True):
- """Renders given network description from 'net' (XML string).
- When finished, sends EVT_RENDERING_DONE event to 'window'. 'id'
- is ID passed to the event, the app can use it as it sees fit.
- 'progress' : display progress bar?
- 'cancellable' : can the user cancel the operation?
- 'background' : should it render in background (in another thread)?
- """
- ui = logging.UICallback(background=background,
- progress=progress, cancellable=cancellable)
- job = JobFromString(net, ui)
- r = Rendering(job, id, window)
- if background:
- worker.enqueue(r.run)
- else:
- r.run()
-
-
- def renderSingleFrame(task, frame, window, id=None):
- """Renders single frame on background. 'task' is openvip.Task instance,
- 'frame' is number of video frame to render, 'window' and 'id' are
- same as in renderFromString. This function sends same event
- as renderFromString."""
- job = JobSingleFrame(task, frame)
- r = Rendering(job, id, window)
- worker.enqueue(r.run)
-